进程间程序分析的基础是ICFG。CFG是单个procedure的控制流图,ICFG则是全程序的控制流图。

ICFG的构建

在CFG的call point处出发,增加call edge和return edge,就得到了ICFG。具体来说,从call point的出口连接到callee function的入口,得到call edge;从callee function的出口连接到call point的下一条语句的入口,得到return edge。

有些callee function可以在编译期确定,但有些不行。如virtual function。这是就需要应用一些技术来构建ICFG。

CHA (Class Hierarchy Analysis)

由Jeff Dane提出,仅仅通过引用的类型来确定所有可能被调用的virtual function。优点是迅速,缺点是精度可能较低。

假设有类层次:

A-B-C
  |
  +-D

其中A,C,D都实现了方法f。

假设有下面一段代码:

C c = ...;
c.f();

CHA将得到Resolve(c.f) = {Dispath(C,f)} = {C.f}

A a = ...;
a.f();

CHA将得到Resolve(a.f) = {Dispath(A,f), Dispath(B,f), Dispath(C, f), Dispath(D,f)} = {A.f, C.f, D.f}

即CHA认为一个virtual call可能call的对象为Resolve(A.f) = {Dispath(X,f) for X in subclassOf(A)}。(当然,subclassOf(A)中包括A自身)。

PTA (Pointer Analysis)

指针分析可以确定一个引用可能指向的对象,进而缩小可能调用对象的范围。

ICFG上的数据流分析

除了之前在CFG中的Node Transformer外,现在要加上call edge和return edge的edge transformer,来模拟传参和返回的过程。

首先来讨论call site的node transformer。其唯一的转换就是kill掉赋值LHS的变量的值。

以上图为例,call edge传递信息x=6。return edge传递信息b = 7。call to return edge(黑色边)传递信息a = 6